2024.4.4 データセットの標準化【sklearn】
公式
標準化:
$ z_i = \frac{x_i - \bar{x}}{\sigma}
但し、
$ \bar{x} : 平均
$ \sigma : 標準偏差
code:std01.py
from sklearn.preprocessing import StandardScaler
import numpy as np
ss = StandardScaler()
data = np.array(1, 0], 0, 0.5, [0.5, -5)
result = ss.fit_transform(data)
print('元データ =\n', data)
print('平均:', ss.mean_)
print('分散:', ss.var_)
print('変換結果 =\n', result)
結果を確認しよう。
code:result.txt
元データ =
[ 1. 0.
0. 0.5
0.5 -5. ]
平均: 0.5 -1.5
分散: 0.16666667 6.16666667
変換結果 =
[ 1.22474487 0.60404045
-1.22474487 0.80538727
0. -1.40942772]
平均が(ほぼ)ゼロ値となっている。
全ての系列の分散が揃っている。
code:std2.py
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib.pyplot as plt
ss = StandardScaler()
data = np.array(1, 0], 2, 0.5, [-0.3, 3)
yoko = np.arange(0, data.size, 1)
result = ss.fit_transform(data)
print('元データ =\n', data)
print('平均:', ss.mean_)
print('分散:', ss.var_)
print('変換結果 =\n', result)
fig = plt.figure()
#
ax1 = fig.add_subplot(1,2,1)
ax1.set_title('data')
ax1.grid()
ax1.bar(yoko, data.flatten())
#
ax2 = fig.add_subplot(1,2,2)
ax2.set_title('result')
ax2.grid()
ax2.bar(yoko, result.flatten())
#
plt.show()
より分かり易く可視化すると、
https://scrapbox.io/files/667e45709a47ca001c025e11.png
単なるスケール変換ではないことがわかる。
実践例
StandardScalerにはDataFrameを渡すことができる。
code:std03.py
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import pandas as pd
scaler1 = StandardScaler()
X1, y = load_iris(return_X_y=True)
df1 = pd.DataFrame(X1)
scaler1.fit(df1)
result = scaler1.transform(df1)
df2 = pd.DataFrame(result)
print('df1 =')
print(df1.describe())
print('df2 =')
print(df2.describe())